<html>
<head>
<title>JSFlow Named Mutex sample</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<script type="text/javascript" src="../html/html.js"></script>
<script type="text/javascript" src="jsflow.js"></script>
<script type="text/javascript">

function $(id){return document.getElementById(id);}

// Журнал
var log = [];

with(JSFlow){
	
	// Процесс определяем в виде функции, возвращающей исполняемый экземпляр процесса.
	// При каждом запуске создается новый экземпляр.
	var process = function(){
		return sequence(
			function(){
				var go = new Continuation();
				log = [];
				go();
			},
			
			parallel(
				// Запускаем параллельно несколько однотипных процессов со смещением по времени.
				// Все эти процессы обращаются к одному журналу (log).
				// Необходимо обеспечить, чтобы пока один процесс не произведет все необходимые записи,
				// другой процесс не допускался бы к ресурсу.
				sequence(
					wait(100),
					// Входим в именованный мьютекс
					openMutex("mutex1"),
					// В этом цикле происходит конкурентный доступ нескольких ветвей к журналу (log)
					times(10, 10, function(i){
						log.push(i);
					}),
					wait(500),
					// освобождаем именованный мьютекс
					releaseMutex("mutex1")
				),
				
				sequence(
					wait(130),
					openMutex("mutex1"),
					times(10, 10, function(i){
						log.push(i);
					}),
					wait(500),
					releaseMutex("mutex1")
				),
				
				sequence(
					wait(134),
					openMutex("mutex1"),
					times(10, 10, function(i){
						log.push(i);
					}),
					wait(500),
					releaseMutex("mutex1")
				)
			),
			
			function(){with(Html){
				// Ожидаемая последовательность записей в журнале:
				var expectation = "012345678901234567890123456789";
				
				// Проверка результатовы выполнения процесса:
				var res = log.join("");
				$("out").innerHTML = res==expectation?span({style:"color:#008800;"}, "OK"):span(
					span({style:"color:#ff0000;"}, "Failure "),
					br(),
					" Expected ", expectation,
					", but result is ", res
				);
			}}
		);
	};
	
}

function runProcess(){
	$("out").innerHTML = "Running... (wait about 3 seconds)";
	process().run();
}

</script>
</head>
<body>
	<h1>JSFlow Named Mutex sample</h1>
	<p>Данный пример аналогичен <a href="mutexDemo.htm">предыдущему</a>, но здесь используется именованный мьютекс.</p>
	<p>Именованный мьютекс создается в глобальной коллекции мьютексов, и доступен, соответственно, из любой точки кода.</p>
</p>
	<button onclick="runProcess()">Run Process</button><br><br><br>
	<div id="out">
</body>
</html>